package com.design.patterns.creativeModel.adapter;

import com.design.patterns.creativeModel.adapter.service.HighSchool;
import com.design.patterns.creativeModel.adapter.service.Impl.HighSchoolImpl;
import com.design.patterns.creativeModel.adapter.service.Impl.StudentsImpl;
import com.design.patterns.creativeModel.adapter.service.Impl.TeacherImpl;
import com.design.patterns.creativeModel.adapter.wrapper.TeacherAdapter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 适配器模式
 * 目的：将一个类的接口转换成客户希望的另外一个接口，使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
 *
 */
public class AdapterMain {

    public static void main(String[] args) {
        /**
         * 编写一个Adapter的步骤如下：
         * 实现目标接口；
         * 内部持有一个待转换接口的引用；
         * 在目标接口的实现方法内部，调用待转换接口的方法。
         *
         * 适配器模式在java的标准库中有广泛的应用，如下例子
         */
        String[] exit = new String[]{
                "java",
                "python",
                "javascript",
                "go"
        };
        /**
         * 这里的List<T> Arrays.asList(T[])就相当于一个转换器，它可以把数组转换为List。
         */
        List<String> list = new ArrayList<>(Arrays.asList(exit));
        /**
         * 我们抽象一下适配器模式：
         * 老师上课，学生听课+预习
         * 老师今天生病了，请学生来代课
         * 正常来说是老师来上课，但是我们让预习了第二天的课的学生来上课
         */
        HighSchool highSchool = new HighSchoolImpl();
        /**
         * 正常情况下是老师自己上课
         */
        String TeacherImpl = highSchool.haveaclass(new TeacherImpl());
        System.out.println(TeacherImpl);
        /**
         * 现在学生代课需要一个适配器，将学生转换成老师的接口
         */
        String TeacherAdapter = highSchool.haveaclass(new TeacherAdapter(new StudentsImpl()));
        System.out.println(TeacherAdapter);
    }
}
